 #include "multitasker.h"
 
 
 extern task_t task_vector[MAX_TASK];
 extern int actual_task;
 
 int queue[MAX_PRIORITY-MIN_PRIORITY+1];
 /*
 Algoritmo clasico de multitasker, donde hay una lista por cada prioridad,
 y se ejecutan primero las mas prioritarias, y ultimas las menos.
 */
 
 /*
 Agrega una tarea a la cola que corresponde a su prioridad.
 */
 void unblock(int task){
 	/*
 	Elijo la cola que corresponde a su prioridad.
 	*/
	int* first=&queue[task_vector[task].priority-MIN_PRIORITY];
 	
 	/*
 	Agrego la tarea al final de dicha cola.
 	*/
 	while(*first!=-1){
 		/*
 		Si la tarea ya estaba en la cola no hago nada.
 		*/
 		if(*first==task){
 			return;
 		}
 		first = &task_vector[*first].next;
 	}
 	task_vector[task].next=-1;
 	*first=task;
 	
 	/*
	Le seteo el estado en listo.
 	*/
 	task_vector[task].state=Ready;
}
 
 /*
 Cambia el estado de la tarea al que uno elija.
 */
 void block(int state){
 	task_vector[actual_task].state=state;
 }
 
 
 /*
 Busca la tarea a la que le corresponde seguir y la retorna.
 */
 int next_task(){
 	/*
 	Si no se bloqueo, agrega la tarea que estaba ejecutando a la cola que le corresponde.
 	*/
 	if(task_vector[actual_task].state==Ready){
 		unblock(actual_task);
 	}
	
 	/*
 	Busca la cola de maxima prioridad que no este vacia, y pone a ejecutar el proceso
 	que este primero en dicha cola, y lo saca de la cola.
 	*/
 	int i;
 	for(i=MAX_PRIORITY-MIN_PRIORITY;i>=0;i--){
 		if(queue[i]!=-1){
 			int ret=queue[i];
 			queue[i]=task_vector[ret].next;
 			return ret;
 		}
 	}
 	/*
 	Nunca se deberia llegar aca, es donde se llega si se mueren todos los procesos.
 	*/
 	printk("no hay procesos(no se deberia llegar a imprimir nunca este mensaje)\n");
 	while(1);
 }
 
 /*
 Inicializa todas las colas como vacias.
 */
 void init_scheduler(){
 	int i;
 	for(i=0;i<MAX_PRIORITY-MIN_PRIORITY;i++){
 		queue[i]=-1;
 	}
 }

